package com.air.controller.passenger;



import com.air.dto.PassengerDTO;
import com.air.dto.PassengerLoginDTO;
import com.air.dto.PassengerPageQueryDTO;
import com.air.dto.PassengerRegisterDTO;
import com.air.entity.AirLine;
import com.air.entity.Passenger;

import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.PassengerService;

import com.air.vo.PassengerLoginVO;
import com.air.vo.PassengerVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 旅客信息控制器，负责处理与旅客相关的REST API请求。
 * 通过@RestController注解，标识该类为Spring MVC中的控制器，负责处理HTTP请求。
 * @RequestMapping("/passenger")注解指定了该控制器处理的所有请求的URL前缀为/passenger。
 * @Slf4j注解为类提供了日志记录功能，通过这个注解，可以在类中直接使用log变量来记录日志。
 * @Api注解为该类提供了Swagger文档的元数据，用于描述这个类的功能和它所包含的API。
 */
@RestController
@RequestMapping("/passenger")
@Slf4j
@Api(tags = "旅客相关接口")
public class PassengerController {

    @Autowired
    private PassengerService passengerService; // 注入PassengerService对象


    /**
     * 注册旅客信息。
     * 该方法通过接收一个PassengerDTO对象作为请求体，将旅客信息注册到系统中。
     * 不返回具体的注册结果，只表明操作是否成功。
     *
     * @param passengerDTO 包含旅客信息的数据传输对象，用于注册新旅客。
     * @return 返回一个操作结果对象，表示注册操作是否成功。
     */
    @PostMapping("/register")
    @ApiOperation("注册旅客")
    public Result save(@RequestBody PassengerRegisterDTO passengerDTO){

        // 调用乘客服务层的方法，保存旅客信息。
        passengerService.save(passengerDTO);

        // 返回一个表示操作成功的结果对象。
        return Result.success();
    }


    /**
     * 旅客登录请求。
     * 该方法接收一个PassengerLoginDTO对象作为请求体，其中包含了旅客的登录信息。
     * 方法通过调用passengerService的login方法来验证旅客的登录信息，并返回一个包含登录详情的PassengerLoginVO对象。
     *
     * @param passengerLoginDTO 旅客登录信息的数据传输对象，包含用户名和密码等登录所需信息。
     * @return 返回一个Result对象，其中包含了登录成功的旅客信息，如ID、用户名和真实姓名等。
     */
    @PostMapping("/login")
    @ApiOperation("旅客登录")
    public Result<PassengerLoginVO> login(@RequestBody PassengerLoginDTO passengerLoginDTO) {
        // 记录登录尝试的日志
        log.info("旅客登录：{}", passengerLoginDTO);

        // 调用服务层方法进行登录验证
        Passenger passenger =passengerService.login(passengerLoginDTO);

        // 构建并返回登录详情的视图对象
        PassengerLoginVO passengerLoginVO = PassengerLoginVO.builder()
                .id(passenger.getId())
                .userName(passenger.getUsername())
                .name(passenger.getName())
                .build();

        return Result.success(passengerLoginVO);
    }


    /**
     * 用户登出请求的接口。
     *
     * 本接口用于处理用户登出操作。登出操作通常是用户主动发起的，旨在终止当前用户的会话，

     * 注意：由于本示例中方法体为空，实际的登出逻辑（如清除会话）应在此方法中实现。
     *
     * @return {@link Result<String>} 表示登出操作的结果。成功登出时，可以返回一个成功标记，
     *
     */
    @PostMapping("/logout")
    @ApiOperation("旅客退出")
    public Result<String> logout() {
        return Result.success();
    }


    /**
     * 分页查询旅客信息
     *
     * 该接口通过接收PassengerPageQueryDTO对象作为参数，实现旅客信息的分页查询。
     * 返回查询结果的分页信息，包括总数、当前页码、每页条数等。
     *
     * @param passengerPageQueryDTO 包含分页查询条件的DTO（数据传输对象），如页码、每页条数等。
     * @return Result<PageResult> 包含查询结果的分页信息，如果查询成功，resultCode为200；如果查询失败，resultCode为其他错误码，并包含错误信息。
     */
    @PostMapping("/page")
    @ApiOperation("分页查询旅客")
    public Result<PageResult> page(PassengerPageQueryDTO passengerPageQueryDTO) {
        // 调用乘客服务的分页查询方法，传入查询条件DTO，获取分页查询结果
        PageResult pageResult = passengerService.pageQuery(passengerPageQueryDTO);
        // 将查询结果封装到Result对象中，表示操作成功，返回给前端
        return Result.success(pageResult);
    }

    /**
     * 根据旅客ID获取旅客信息的API操作。
     *
     * 该方法使用GET请求方法，并通过路径参数接收旅客的ID。其目的是从系统中检索指定ID的旅客信息。
     * 使用了Swagger的@ApiOperation注解来描述这个操作的功能。
     *
     * @param id 旅客的唯一标识符。这是从请求的路径中提取的参数。
     * @return 返回一个包含旅客信息的结果对象。如果查询成功，结果对象中的data字段将包含旅客的详细信息。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询旅客")
    public Result<PassengerVO> getById(@PathVariable Long id) {
        // 记录查询操作开始的日志，包括查询的旅客ID。
        log.info("根据id查询旅客：{}", id);
        // 调用乘客服务，根据ID获取乘客信息。
        PassengerVO passengerVO = passengerService.getById(id);
        // 返回查询结果，如果查询成功，则将旅客信息封装在结果对象中返回。
        return Result.success(passengerVO);
    }

    /**
     * 修改旅客信息接口
     *     * 该接口通过PUT请求方式，接收一个PassengerDTO对象作为请求体，用于更新旅客的信息。
     * @param passengerDTO 包含待更新旅客信息的数据传输对象（DTO）。
     *                     DTO中应包含旅客的所有关键信息，以便于一次性更新所有必要的字段。
     * @return 返回一个Result对象，表示操作的结果。
     *         若操作成功，Result对象中的success方法将返回true；
     *         若操作失败，Result对象中将包含错误信息。
     */
    @PutMapping
    @ApiOperation("修改旅客信息")
    public Result update(@RequestBody PassengerDTO passengerDTO) {
        // 记录日志，用于追踪和调试
        log.info("修改旅客信息：{}", passengerDTO);
        // 调用乘客服务层的方法，实际执行旅客信息的更新操作
        passengerService.update(passengerDTO);
        // 返回操作成功的结果
        return Result.success();
    }

}
